/**
 * \file CGrilleWidget.h
 * \author Corentin Le Bail
 * \date 2009-2011
 * \brief Fichier de déclaration de la classe des fenêtres de lignes.
 */
//------------------------------------------------------------------------------
#ifndef __CGRILLEWIDGET_H__
#define __CGRILLEWIDGET_H__
//------------------------------------------------------------------------------
#include <QWidget>
#include "ui_CGrilleWidget.h"
#include "CMyTableWidgetItem.h"
//------------------------------------------------------------------------------
/**
 * \class CGrilleWidget CGrilleWidget.h "CGrilleWidget.h"
 * \brief Classe des fenêtres de lignes.
 */
class CGrilleWidget : public QWidget, private Ui::GrilleWidget
{
	Q_OBJECT
	public:
		/**
		* \fn CGrilleWidget(QList< CColumnModel *> *columnsModel, QWidget *parent=0, bool toolBarEnabled=true, bool canSwap=false, bool canFilter=false)
		 * \brief Constructeur
		 * \param[in] columnsModel Modèle de colonnes
		 * \param[in] parent Référence de la fenêtre parent
		 * \param[in] toolBarEnabled La barre d'outils ajoute / supprime est active ?
		 * \param[in] canSwap La barre d'outils monte / descend est active ?
		 * \param[in] canFilter La barre d'outils filtre est active ?
		 */
		CGrilleWidget(QList<CColumnModel *> *columnsModel, QWidget *parent=0, bool toolBarEnabled=true, bool canSwap=false, bool canFilter=false);
		/**
		 * \fn void setRowCount(int rows)
		 * \brief Affecte le nombre de ligne de la grille
		 * \param[in] rows Le nombre de ligne
		 */
		void setRowCount(int rows);
		/**
		 * \fn setItem(int row, int column, QTableWidgetItem * item)
		 * \brief Affecte un élément à une case de la grille
		 * \param[in] row Index de la ligne
		 * \param[in] column Index de la colonne
		 * \param[in] item Elément a affecter
		 */
		void setItem(int row, int column, QTableWidgetItem * item);
		/**
		 * \fn void resizeRowsToContents(void)
		 * \brief Redimensionne la hauteur des lignes en fonction de leur contenu
		 */
		void resizeRowsToContents(void);
		/**
		 * \fn void setColumnWidth(int column, int width)
		 * \brief Redimensionne la largeur d'une colonne
		 * \param[in] column Index de la colonne à redimensionner
		 * \param[in] width Largeur de la colonne
		 */
		void setColumnWidth(int column, int width);
		/**
		 * \fn int addRow(void)
		 * \brief Ajoute une ligne à la grille
		 * \return Le nombre de ligne de la grille après l'ajout
		 */
		int addRow(void) { int r=table->rowCount(); table->setRowCount(table->rowCount()+1); return r; }
		/**
		 * \fn QTableWidgetItem * item(int row, int column)
		 * \param[in] row Index de la ligne de la cellule
		 * \param[in] column Index de la colonne de la cellule
		 * \return Un élément corespondant à une cellule de la grille 
		 */
		QTableWidgetItem * item(int row, int column) { return table->item(row, column); }
		/**
		 * \fn void resizeRowToContents(int row)
		 * \brief Redimensionne la hauteur d'une ligne de la grille en fonction de son contenu
		 * \param[in] row Index de la ligne à redimensionner
		 */
		void resizeRowToContents(int row) { table->resizeRowToContents(row); }
		/**
		 * \fn void insertRow(int row)
		 * \brief Insert une ligne dans la grille
		 * \param[in] row Index de la ligne avant laquelle insérer la nouvelle ligne
		 */
		void insertRow(int row) { table->insertRow(row); }
		/**
		 * \fn void enableCommand(bool enable)
		 * \brief Active / déactive la barre d'outils ajoute / supprime
		 * \param[in] enable True pour activer la barre d'outils, false sinon
		 */
		void enableCommand(bool enable);
		/**
		 * \fn void enableSwap(bool enable)
		 * \brief Active / déactive la barre d'outils monte / descend
		 * \param[in] enable True pour activer la barre d'outils, false sinon
		 */
		void enableSwap(bool swap);
		/**
		 * \fn void showFilter(bool show)
		 * \brief Affiche / cache la barre d'outils filtre
		 * \param[in] show True pour afficher la barre d'outils, false sinon
		 */
		void showFilter(bool show);
		/**
		 * \fn void setItemDelegateForColumn(int column, QAbstractItemDelegate * delegate)
		 * \brief Affecte un contrôle d'édition à une colonne de la grille
		 * \param[in] column Index de la colonne de la grille
		 * \param[in] delegate Référence du contrôle permettant l'édition
		 */
		void setItemDelegateForColumn(int column, QAbstractItemDelegate * delegate) { 
			table->setItemDelegateForColumn(column, delegate); 
		}
		/**
		 * \fn int currentRow(void)
		 * \return L'index de la ligne de la grille courante
		 */
		int currentRow(void) { return table->currentRow(); }
		/**
		 * \fn int rowCount(void)
		 * \return Le nombre de ligne d ela grille
		 */
		int rowCount(void) { return table->rowCount(); }
		/**
		 * \fn QAbstractItemDelegate * itemDelegateForColumn(int column)
		 * \param[in] column Index de la colonne de la grille
		 * \return Référence du contrôle permettant l'édition permettant l'édition de la colonne
		 */
		QAbstractItemDelegate * itemDelegateForColumn(int column) { return table->itemDelegateForColumn(column); }
		/**
		 * \fn void swapRows(int r1, int r2, bool *tableSwap)
		 * \brief Permutte 2 lignes de la grille
		 * \param[in] r1 Index de la première ligne de la grille
		 * \param[in] r2 Index de la deuxième ligne de la grille
		 * \param[in] tableSwap Tableau indiquant les colonnes permuttables
		 */
		void swapRows(int r1, int r2, bool *tableSwap);
		/**
		 * \fn void setFilters(QHash<QString, QString> filters)
		 * \brief Affecte les filtres utilisable
		 * \param[in] filters Liste indexé contenant le nom du filtre et la fonction SQL permettant le filtre
		 */
		void setFilters(QHash<QString, QString> filters);
		/**
		 * \fn void clearTable(void)
		 * \brief Vide la grille
		 */
		void clearTable(void);
		/**
		 * \fn QString getFilter(void)
		 * \return Le filtre courant formaté en SQL
		 */
		QString getFilter(void);
		/**
		 * \fn void clearFilter(void)
		 * \brief Supprime le filtre courant
		 */
		void clearFilter(void) { leFilterValue->setText(""); }
		/**
		 * \fn const CColumnModel * getColumnModel(int column)
		 * \param[in] column Index de la colonne
		 * \return Le modèle de la colonne passé en paramètre
		 */
		CColumnModel * getColumnModel(int column) { return table->getColumnModel(column); }
		/**
		 * \fn in getColumnModelCount(void)
		 * \return le nombre de colonnes du modèle
		 */
		int getColumnModelCount(void) { return table->getColumnModelCount(); }
		/**
		 * \fn int loadGrille(QSqlQuery *query, QString primaryKeyName)
		 * \brief Charge la grille en fonction de la requête SQL passé en paramètre
		 * \param[in] query Objet résultat de requête SQL
		 * \param[in] primaryKeyName Nom de la clé primaire
		 * \return Le nombre d'éléments de la grille
		 */
		int loadGrille(QSqlQuery *query, QString primaryKeyName="");
	private:
		bool _toolBarEnabled;
		bool _canSwap;
		bool _canFilter;
		bool _canExport;
		bool onSwap;
		
		void setColumnsModel(QList<CColumnModel *> *columnsModel);
	signals:
		/**
	 	 * \fn void ajoute(bool& goToLast)
		 * \brief Signal d'ajout d'une ligne à la grille
	 	 * \param[out] goToLast True pour positionner l'ascenseur sur la dernière ligne de la grille
		 */
		void ajoute(bool& goToLast);
		/**
		 * \fn void supprime(int row, bool& ok)
		 * \brief Signal de supression d'une ligne à la grille
		 * \param[in] row Ligne à supprimer
		 * \param[out] ok True pour supprimer la ligne de la grille
		 */
		void supprime(int row, bool& ok);
		/**
		 * \fn void cellChanged(int row, int column)
		 * \brief Signal de changement de celulle
		 * \param[in] row Index de la nouvelle ligne
		 * \param[in] column Index de la nouvelle colonne
		 */
		void cellChanged(int row, int column);
		/**
		 * \fn void cellDoubleClicked(int row, int column)
		 * \brief Signal de double clique sur une celulle
		 * \param[in] row Index de la ligne double cliqué
		 * \param[in] column Index de la colonne double cliqué
		 */
		void cellDoubleClicked(int row, int column);
		/**
		 * \fn void firstRowChange(bool vide)
		 * \brief Signal de modification de la première ligne de la grille
		 * \param[in] vide Il n'y a pas de première ligne ?
		 */
		void firstRowChange(bool vide);
		/**
		 * \fn void customContextMenuRequested(const QPoint & pos)
		 * \brief Signal d'appel de menu contextuel
		 * \param[in] pos Position du menu contextuel dans la fenêtre parent
		 */
		void customContextMenuRequested(const QPoint & pos);
		/**
		 * \fn void monte(int row)
		 * \brief Signal de monté d'une ligne
		 * \param[in] row Index de la ligne a monter
		 */
		void monte(int row);
		/**
		 * \fn void descend(int row)
		 * \brief Signal de descente d'une ligne
		 * \param[in] row Index de la ligne a descendre
		 */
		void descend(int row);
		/**
		 * \fn void filter(QString filtre)
		 * \brief Signal acquitement de filtre
		 * \param[in] filtre Filtre SQL
		 */
		void filter(QString filtre);
		/**
		 * \fn void beforeInsert(const QSqlQuery *query, CMyTableWidgetItem *item)
		 * \brief Signal émit juste avant l'insertion dans la grille lors de l'appel de la fonction loadGrille
		 * \param[out] query Enregistrement SQL a inséré
		 * \param[out] item Nouvel élément de grille
		 */
		void beforeInsert(const QSqlQuery *query, CMyTableWidgetItem *item);
		/**
		 * \fn void beforeChangeRecord(const QSqlQuery *query, int row)
		 * \brief Signal émit juste avant de changer d'enregistrement lors de l'appel de la fonction loadGrille
		 * \param[out] query Enregistrement SQL courant
		 * \param[out] row Index de l'élément de la grille corespondant
		 */
		void beforeChangeRecord(const QSqlQuery *query, int row);
	private slots:
		void on_toolButtonAjoute_clicked(bool checked = false);
		void on_toolButtonSupprime_clicked(bool checked = false);
		void on_toolButtonExport_clicked(bool checked = false);
		void on_table_cellChanged(int row, int column);
		void on_table_cellDoubleClicked(int row, int column);
		void on_table_customContextMenuRequested(const QPoint & pos);
		void on_toolButtonMonte_clicked(bool checked = false);
		void on_toolButtonDescend_clicked(bool checked = false);
		void onFilter(void);
		void on_table_beforeInsert(const QSqlQuery *query, CMyTableWidgetItem *item);
		void on_table_beforeChangeRecord(const QSqlQuery *query, int row);
};
//------------------------------------------------------------------------------
#endif //__CGRILLEWIDGET_H__
//------------------------------------------------------------------------------